package com.sinog.front.util;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;

/**
 * @desc 根据ftl模版生成word文件到服务器
 * @author lzq
 * @date 2020-07-23 5:48 下午
 */
@Slf4j
public final class FreemarkerTemplateUtil {

    private static final String FTL_PATH = "/templates/doc/";

    /**
     * 根据ftl模版生成word文件
     * @param data 套模版的数据
     * @param fileRootPath 生成word文件的文件路径
     * @param fileName 生成word的文件名
     * @param template 使用的ftl模版的名称
     * @return boolean
     */
    public static boolean isSaveWordFileSuccess(Map<String,?> data,String fileRootPath,String fileName,String template) {
        Writer fw = null;
        try {
            String file = fileRootPath + fileName;
            //创建freemarker模版引擎配置类
            Configuration conf = new Configuration(Configuration.getVersion());
            conf.setDefaultEncoding("utf-8");
            //设置模版文件的位置,方式1:从文件系统中读取
            //File dir = new File(fileRootPath);
            //conf.setDirectoryForTemplateLoading(dir);
            //方式2:从类路径下读
            conf.setClassForTemplateLoading(FreemarkerTemplateUtil.class,FTL_PATH);
            //构建输出流
            fw = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(Paths.get(file)),StandardCharsets.UTF_8));
            //根据模版名称和字符集构建模版对象
            Template tp = conf.getTemplate(template,"utf-8");
            //模版对象把数据填充到work输出
            tp.process(data,fw);
            fw.flush();
            return true;
        } catch(TemplateNotFoundException e) {
            log.error("ftl模版未找到",e);
            return false;
        } catch(TemplateException | IOException e) {
            log.error("发生异常:",e);
            return false;
        } finally {
            if(null != fw) {
                try {
                    fw.close();
                } catch(IOException e) {
                    log.error("发生异常:",e);
                }
            }
        }
    }
}